package main

import (
	"fmt"
	"gitee.com/manoshi/go-util/conf"
	"gitee.com/manoshi/go-util/log"
	"gitee.com/manoshi/go-util/mysqlrym"
	"gitee.com/manoshi/go-util/sqlOp"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/locales/en"
	"github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	en1 "github.com/go-playground/validator/v10/translations/en"
	zh1 "github.com/go-playground/validator/v10/translations/zh"
	"reflect"
	"strings"
	"time"
)

var trans ut.Translator

type SignUpForm struct {
	// 参数age必填;大于等于1小于等于100
	Age uint8 `json:"age" binding:"required,gte=1,lte=100"`
	// 参数name必填;最小长度3最大长度15
	Name string `json:"name" binding:"required,min=3,max=15"`
	// 参数email必填;必须符合email规范
	Email string `json:"email" binding:"required,email"'`
	// 参数password必填
	Password string `json:"password" binding:"required"`
	// 参数re_password必填;内容必须与password相同
	RePassword string `json:"re_password" binding:"required,eqfield=Password"`
	//开始时间
	StartTime string `json:"startTime" binding:"md5"`
	EndTime   string `json:"endTime" binding:"md4"`
}

func InitTrans(locale string) error {
	// 修改gin框架中的validator引擎属性,实现定制
	if validate, ok := binding.Validator.Engine().(*validator.Validate); ok {
		// 注册一个获取json的tag的自定义方法
		validate.RegisterTagNameFunc(func(field reflect.StructField) string {
			name := strings.SplitN(field.Tag.Get("json"), ",", 2)[0]
			if name == "-" {
				// json的tag标签没有填默认"-"
				return ""
			}
			return name
		})
		zhT := zh.New() // 中文翻译器
		enT := en.New() // 英文翻译器
		// 第一个参数是备用的语言环境;后面的参数是应该支持的语言环境
		uni := ut.New(zhT, zhT, enT)
		var ok bool
		trans, ok = uni.GetTranslator(locale)
		if !ok {
			return fmt.Errorf("uni.GetTranslator(%s)", locale)
		}
		if locale == "en" {
			// 英文
			en1.RegisterDefaultTranslations(validate, trans)
		} else {
			// 非英文的统一使用中文
			zh1.RegisterDefaultTranslations(validate, trans)
		}
	}
	return nil
}

// 去除error信息中的go语言的struct名
func removeTopStruct(fileds map[string]string) map[string]string {
	res := map[string]string{}
	for k, v := range fileds {
		res[k[strings.Index(k, ".")+1:]] = v
	}
	return res
}

type UPriceRuleItem struct {
	CreateTime   *time.Time `gorm:"column:create_time" json:"createTime,omitempty"` // 创建时间
	Id           *int32     `gorm:"primaryKey:id" json:"id"`                        // 主键
	PriceRuleId  *int32     `gorm:"column:price_rule_id" json:"priceRuleId"`        // 计价规则id
	RentDuration *int32     `gorm:"column:rent_duration" json:"rentDuration"`       // 租赁时长（分钟）
	RentMoney    *float64   `gorm:"column:rent_money" json:"rentMoney"`             // 租赁价格（元）
	ShowSort     *int32     `gorm:"column:show_sort" json:"showSort"`               // 显示排序，由小到大排序
	UpdateTime   *time.Time `gorm:"column:update_time" json:"updateTime,omitempty"` // 更新时间
}

func buildBatchInsertSql(r interface{}) (string, []interface{}) {
	//insert into u_price_rule_item(price_rule_id,rent_duration,rent_money,show_sort,create_time,update_time)
	//values(-99,1,1,1,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP),(-99,2,2,1,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)
	var sql string
	var sqlParams []interface{}
	t := reflect.TypeOf(r)

	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		fmt.Printf("Field tag-json: %s\n", field.Tag.Get("gorm"))
		fmt.Printf("Field Name: %s\n", field.Name)
		fmt.Printf("Field Type: %s\n", field.Type)
		fmt.Println() // 打印空行以便于区分不同的字段信息
	}

	return sql, sqlParams
}

// SSite 点位
type SSite struct {
	Address           *string    `gorm:"column:address" json:"address,omitempty"`                       // 地址
	AreaId            *int32     `gorm:"column:area_id" json:"areaId"`                                  // 区域id
	BusinessTimeBegin *string    `gorm:"column:business_time_begin" json:"businessTimeBegin,omitempty"` // 每日营业开始时间 08:00
	BusinessTimeEnd   *string    `gorm:"column:business_time_end" json:"businessTimeEnd,omitempty"`     // 每日营业结束时间 22:30
	CanDelivery       *int32     `gorm:"column:can_delivery" json:"canDelivery"`                        // 是否可配送 1：是；0：否
	CanReserve        *int32     `gorm:"column:can_reserve" json:"canReserve"`                          // 是否可预定 1：是；0：否
	CreateTime        *time.Time `gorm:"column:create_time" json:"createTime,omitempty"`                // 创建时间
	CreatorId         *int32     `gorm:"column:creator_id" json:"creatorId"`                            // 创建人
	Id                *int32     `gorm:"primaryKey:id" json:"id"`                                       // 主键
	Latitude          *float64   `gorm:"column:latitude" json:"latitude"`                               // 纬度
	Longitude         *float64   `gorm:"column:longitude" json:"longitude"`                             // 经度
	Name              *string    `gorm:"column:name" json:"name,omitempty"`                             // 名称
	OnlineStatus      *uint8     `gorm:"column:online_status" json:"onlineStatus"`                      // 在线状态 1：在线；0：下线
	Picture           *string    `gorm:"column:picture" json:"picture,omitempty"`                       // 门面照
	RegionId          *int32     `gorm:"column:region_id" json:"regionId"`                              // 行政区县id
	Status            *uint8     `gorm:"column:status" json:"status"`                                   // 状态 1：启用；0：禁用
	Tel               *string    `gorm:"column:tel" json:"tel,omitempty"`                               // 电话号码
	Type              *int32     `gorm:"column:type" json:"type"`                                       // 类型 1：门店仓库；2：租赁仓库；3：子仓库；4：跨区归还库；5：售卖仓库；6：体验仓库；7：自用仓库；8：赠送仓库；9：遗失仓库；10：报废仓库；11：待回收物资仓库；12：维修维护仓库；13：维修维护等待库；14：维修维护进行库；15：维修维护完成库；16：已售物资维修维护仓库；17：生产仓库；18：司机导游临时子仓库
	UpdaterId         *int32     `gorm:"column:updater_id" json:"updaterId"`                            // 更新人
	UpdateTime        *time.Time `gorm:"column:update_time" json:"updateTime,omitempty"`                // 修改时间
}

func Init() {
	conf.BaseConfig(conf.Config{
		LogColorful: true,
		LogShowSql:  true,
		LogLevel:    log.LevelError,
		Mysql: conf.MysqlConf{
			//Host: "to-chengdu-office.168cad.top",
			//Port: 50015,
			Host:      "192.168.1.37",
			Port:      3306,
			User:      "root",
			Password:  "dcrym29210924..",
			NameSpace: "test_oxygen_station",
		},
	})
	log.Info("初始化配置")
	mysqlrym.Init()
}

func testDb() {
	Init()
	var site SSite
	mysqlrym.GetDb().Where("name like ?", sqlOp.DimAll("郑秋云")).First(&site)
}

func main() {
	testDb()
}
